package com.iengoo.spacewar;

import javax.swing.*;
import java.io.IOException;
import java.util.List;

/**
 * @author zpym
 * @CopyRight (C) http://www.iengoo.com
 * 博优教育课程研发团队立足IT行业热门岗位需求，课程内容是IT岗位实际工作所需要，
 * 学员在学习期间就能获得必备的操作技能，并在项目经理的带领下完成真实的项目。
 * 积累相当于一到两年的实战经验，提前进入工作状态，职业发展快人一步。
 *
 * 《Java实训课程》报名中
 *
 * 报名咨询电话：13547873773  qq:2680775774
 * 线下学堂地址：龙泉驿区新驿北街4号
 * （用微信扫描游戏中的二维码可以关注我们的公众号，在这里可以了解更多关于我们的信息哦）
 *
 * @brief 生产子弹已经更改子弹坐标
 * @email 122162005@qq.com
 * @date 2018-12-26 13:50
 */
public class WorkerThread extends Thread {
    public volatile boolean stop = false;
    private Craft craft;
    // 每次稚嫩攻击一个地雷，且为上次已经攻击过的地雷
    private Mine currentMine = null;
    private Character currentKeyChar = null;
    private LevelManager lm;
    private JPanel mainPanel;

    public void init(Craft craft, JPanel mainPanel) {
        this.craft = craft;
        this.mainPanel = mainPanel;
        lm = LevelManager.getLevelManager(craft);
    }

    @Override
    public void run() {
        while (!stop) {
            /* 初始化生成地雷 end */
            lm.generateMine();
            lm.mineHitCraft();
            lm.plasmaOutOfBound();
            lm.recoveryAll();

            MineContainer mineList = MineContainer.getInstance();
            // 获取键盘上敲入的字母
            Object o = MessageQueue.getInstance().pop();
            if (o != null && o instanceof Character) {
                currentKeyChar = (Character) o;
            }

            if (GameLevel.ad.equals(Config.CURRENT_GAME_LEVEL)) {
                if ("EnterStartGameZone".equals(o)) {
                    lm.setStartGame2Orange(mainPanel);
                }
                if ("OutOfStartGameZone".equals(o)) {
                    lm.setStartGame2White(mainPanel);
                }
            }

            // 移动地雷
            for (int i = 0; i < mineList.size(); i++) {
                mineList.get(i).move();
            }

            // 找到被击中的地雷
            if (currentMine == null) {
                // 如果current被击中的地雷为空，则应判断当前字母属于那个地雷
                for (int i = 0; i < mineList.size(); i++) {
                    Mine m = mineList.get(i);
                    // 判断该地雷是否被击中
                    // 如果获取到的字母等于某个单词的第一个字母， 则表示该地雷被飞船击中
                    Character firstChar = m.getWord().charAt(0);
                    if (firstChar.equals(currentKeyChar)) {
                        currentMine = m;
                        currentMine.setWasHit(true);
                        break;
                    }
                }
            }

//            else if (currentMine.getHitLetterIndex() + 1 == currentMine.getWord().length()) {
//                //如果被击中的地雷字母被全部击中则将当前地雷设置为null
//                mineList.remove(currentMine);
//                // currentMine = null;
//                // craft.getPlasmaList().removeAll(craft.getPlasmaList());
//            }

            // 飞船开火、改变地雷被击中的字母的下标
            if (currentMine != null && currentMine.getWasHit() && currentKeyChar != null) {
                // 如果离子弹键盘的字母对应的是地雷的字母，则改变下标，并开火
                if (currentMine.getHitLetterIndex() + 1 < currentMine.getWord().length() &&
                        currentKeyChar.equals(currentMine.getWord().charAt(currentMine.getHitLetterIndex() + 1))) {
                    currentMine.setHitLetterIndex(currentMine.getHitLetterIndex() + 1);
                    // 调用开火接口
                    try {
                        /**
                         * 先将所有的y坐标取反，再平移坐标系
                         */
                        // y轴取反（相当于仍然以屏幕左上角为原点，只是y轴向下为﹣）
                        double craftX = craft.getX();
                        double craftY = -craft.getY();
                        double mineX = currentMine.getX();
                        double mineY = -currentMine.getY();

                        // 平移坐标系（坐标系向上左平移，平移后把craft当做原点）
                        double translationX = craft.getX();
                        double translationY = craft.getY();

                        craftX -= translationX;
                        craftY += translationY;
                        mineX -= translationX;
                        mineY += translationY;

                        double distanceX = mineX - craftX;
                        double distanceY = mineY - craftY;


                        double tan = distanceX / distanceY;
                        double radian = Math.atan(tan);

                        craft.setAngle(radian / 1.8);
                        craft.fire();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    // 调用爆炸接口
                    currentKeyChar = null;
                }
            }

            /**
             * 判断粒子炮是不是和当前被击中的字母一致；
             * 或者在没有被击中的地雷的情况下，是否和所有地雷的第一个字母是一致的
             */
            if (currentKeyChar != null) {
                if (currentMine == null) {
                    boolean noLetter = true;

                    for (int i = 0; i < mineList.size(); i++) {
                        Mine mine = mineList.get(i);
                        if (currentKeyChar.equals(mine.getWord().charAt(0))) {
                            noLetter = false;
                            break;
                        }
                    }

                    if (noLetter) {
                        craft.setNoLetter(noLetter);
                        // 设置完值后，将设置为 currentKeyChar null
                        currentKeyChar = null;
                    }
                } else {
                    if (currentMine.getHitLetterIndex() + 1 < currentMine.getWord().length() &&
                            !currentKeyChar.equals(currentMine.getWord().charAt(currentMine.getHitLetterIndex() + 1))) {
                        craft.setNoLetter(true);
                        // 设置完值后，将设置为 currentKeyChar null
                        currentKeyChar = null;
                    }
                }
            }

            /*
             * 改变背景格子的位置
             */
            GridContainer gridList = GridContainer.getInstance();

            for (int i = 0; i < gridList.size(); i++) {
                gridList.get(i).move();
                if (gridList.get(i).getY() > Config.PANEL_HEIGHT) {
                    gridList.get(i).toFirst();
                }
            }

            /*
             * 更改离子弹位置,并判断离子弹是否与地雷相撞
             */
            List<Plasma> plasmaList = craft.getPlasmaList();
            for (Plasma p : plasmaList) {
                p.move(currentMine, craft);

                //并判断离子弹是否与地雷相撞,相撞后将离子炮移除
                if (lm.plasmaHitMine(p, currentMine)) {
                    plasmaList.remove(p);
                    // 这里调用爆炸特效方法，让地雷周边产生爆炸效果
                    try {
                        BombContainer.getInstance().add(new Bomb((int)currentMine.getX(), (int)currentMine.getY()));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    // 离子炮移除后，判断地雷所携带的字母是否已经完全打完，如果打完，则删除地雷
                    // 或者说，当前地雷的最后一个字母被击中，且击中最后字母的离子炮也和地雷相遇
                    // 则删除当前地雷，以及将currentMine设置为null
                    if (currentMine.getHitLetterIndex() == currentMine.getWord().length() - 1
                    && plasmaList.size() == 0) {
                        mineList.remove(currentMine);
                        currentMine = null;
                    }
                }
            }

            /*
             * 飞船切换背景
             */
            craft.switchBG();
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
